home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / arcass.i < prev    next >
Text File  |  1997-10-26  |  9KB  |  295 lines

  1. IMPLEMENTATION MODULE ARCAss;
  2.  
  3. FROM SYSTEM IMPORT ASSEMBLER, ADDRESS;
  4.  
  5. (*$L-,C-,R-,S-*)
  6.  
  7. VAR   
  8.   saveProc:    ADDRESS;
  9.   setAdr:      ADDRESS;
  10.   newProc:     ADDRESS;
  11.   saveUSP:     ADDRESS;
  12.   savenstat2,
  13.   savenstat5,
  14.   saveout2,
  15.   saveout5,
  16.   savein2,
  17.   savein5,
  18.   savestat2,
  19.   savestat5:  ADDRESS;
  20.   myStack:     ARRAY [0..2047] OF CHAR;
  21.  
  22.  
  23. PROCEDURE newnstat();
  24. BEGIN
  25.   ASSEMBLER
  26.     ; Es liegt nie ein Zeichen an. 
  27.     ; als Long wegen $%&@Ý HSMODEM1
  28.     moveq   #0,d0
  29.   END;
  30. END newnstat;
  31.  
  32. VAR     outProc :   outProcType;
  33.  
  34. PROCEDURE newout();
  35.  BEGIN
  36.   ASSEMBLER
  37.     movem.l d0-a6,-(sp)     ; Register sichern 
  38.     move.l  outProc,d0      ; Adresse der Ausgabeprozedur nach A0
  39.     beq.s   nix             ; ist nicht gesetzt
  40.     move.l  d0,a0           ; 
  41.     move.w  $42(sp),d0      ; Zeichen vom Stack holen 
  42.     rol.w   #8,d0           ; fr MM2 umdrehen
  43.     lea     myStack,a3      ; eigenen Stack einrichten 
  44.     move.w  d0,(a3)+        ; Zeichen auf A3-Stack geben fr MM2
  45.     jsr     (A0)            ; Ausgabeprozedur anspringen
  46. nix:
  47.     movem.l (sp)+,d0-a6     ; Register sichern 
  48.     move.w  #1,d0           ; 'Kein Fehler' zurckgeben
  49.   END;
  50.  END newout;
  51.  
  52. (*
  53. PROCEDURE newout();
  54. BEGIN
  55.   ASSEMBLER
  56.     move.w  #1,d0
  57.     rts
  58.   END;
  59. END newout;
  60. *)
  61.  
  62. PROCEDURE newin();
  63. BEGIN
  64.   ASSEMBLER
  65.     moveq   #0,d0
  66.   END;
  67. END newin;
  68.  
  69. PROCEDURE newstat();
  70. BEGIN
  71.   ASSEMBLER
  72.     moveq   #-1,d0
  73.   END;
  74. END newstat;
  75.             
  76. PROCEDURE SetTrap();
  77. BEGIN
  78.   ASSEMBLER
  79. PROC01:    
  80.              clr.l     -(sp)            ; 
  81.              move.w    #$20,-(sp)       ; Super
  82.              trap      #1
  83.              addq.l    #6,sp            ; Stack korrigieren
  84.              move.l    d0,saveUSP       ; alten Stack sichern
  85.              
  86.              move.l    $4f2,a0          ; _sysbase
  87.              move.l    8(a0),a0         ; os->osbeg
  88.              move.w    2(a0),d0         ; osversion
  89.              cmpi.w    #$100,d0         ; TOS 1.0
  90.              beq.w     inst_trap        ; ja, BIOS-Trap installieren
  91.              
  92.              ; Installation in xcon-Vektoren, muž per Hand gemacht werden, da 
  93.              ; die nicht auf Langwortgrenzen liegen :-(
  94.              move.l    #$51E,a0         ; Basisadresse nach a0
  95.              move.l    8(a0),savenstat2 ; xconstat (2)
  96.              move.l    20(a0),savenstat5 ; xconstat (2)
  97.              move.l    #$53E,a0         ; Basisadresse nach a0
  98.              move.l    8(a0),savein2    ; xconin (2)
  99.              move.l    20(a0),savein5   ; xconin (2)
  100.              move.l    #$55E,a0         ; Basisadresse nach a0
  101.              move.l    8(a0),savestat2  ; xcostat (2)
  102.              move.l    20(a0),savestat5 ; xcostat (2)
  103.              move.l    #$57E,a0         ; Basisadresse nach a0
  104.              move.l    8(a0),saveout2   ; xconout (2)
  105.              move.l    20(a0),saveout5  ; xconout (2)
  106.  
  107.              move.l    #$51E,a0         ; Basisadresse nach a0
  108.              move.l    #newnstat,8(a0)  ; neue xconstat Routine
  109.              move.l    #newnstat,20(a0) ; neue xconstat Routine
  110.              move.l    #$53E,a0         ; Basisadresse nach a0
  111.              move.l    #newin,8(a0)     ; neue xconin Routine
  112.              move.l    #newin,20(a0)    ; neue xconin Routine
  113.              move.l    #$55E,a0         ; Basisadresse nach a0
  114.              move.l    #newstat,8(a0)   ; neue xcostat Routine
  115.              move.l    #newstat,20(a0)  ; neue xcostat Routine
  116.              move.l    #$57E,a0         ; Basisadresse nach a0
  117.              move.l    #newout,8(a0)    ; neue xconout Routine
  118.              move.l    #newout,20(a0)   ; neue xconout Routine
  119.  
  120.              ; so, das war's. Raus aus Super modus und zurck
  121.              move.l    saveUSP,-(sp)    ; alten Stack zurck
  122.              move.w    #$20,-(sp)       ; Super
  123.              trap      #1               ; back to user mode
  124.              addq.l    #6,sp            ; stack korrigieren
  125.              
  126.              rts
  127.  
  128. inst_trap:   
  129.              move.l    saveUSP,-(sp)    ; alten Stack zurck
  130.              move.w    #$20,-(sp)       ; Super
  131.              trap      #1               ; back to user mode
  132.              addq.l    #6,sp            ; stack korrigieren
  133.              
  134.              move.l    #-1,-(sp)        ;neuer Vektor
  135.              move.w    #45,-(sp)        ;BIOS Vektor
  136.              move.w    #5,-(sp)         ;Setexc
  137.              trap      #13              ;BIOS
  138.              addq.l    #8,sp
  139.              move.l    d0,saveProc
  140.  
  141.              move.l    #TrapProc,-(sp)    ;neuer Vektor
  142.              move.w    #45,-(sp)        ;BIOS Vektor
  143.              move.w    #5,-(sp)         ;Setexc
  144.              trap      #13              ;BIOS
  145.              addq.l    #8,sp
  146.              rts
  147.   END
  148. END SetTrap;
  149.  
  150. PROCEDURE RestoreTrap();
  151. BEGIN
  152.   ASSEMBLER
  153. PROC02:      
  154.              clr.l     -(sp)            ; 
  155.              move.w    #$20,-(sp)       ; Super
  156.              trap      #1
  157.              addq.l    #6,sp            ; Stack korrigieren
  158.              move.l    d0,saveUSP       ; alten Stack sichern
  159.              
  160.              move.l    $4f2,a0          ; _sysbase
  161.              move.l    8(a0),a0         ; os->osbeg
  162.              move.w    2(a0),d0         ; osversion
  163.              cmpi.w    #$100,d0         ; TOS 1.0
  164.              beq.s     inst_trap        ; ja, BIOS-Trap installieren
  165.  
  166.              ; Installation in xcon-Vektoren, muž per Hand gemacht werden, da 
  167.              ; die nicht auf Langwortgrenzen liegen :-(
  168.              move.l    #$51E,a0         ; Basisadresse nach a0
  169.              move.l    savenstat2,8(a0) ; xconstat (2)
  170.              move.l    savenstat5,20(a0) ; xconstat (2)
  171.              move.l    #$53E,a0         ; Basisadresse nach a0
  172.              move.l    savein2,8(a0)    ; xconin (2)
  173.              move.l    savein5,20(a0)   ; xconin (2)
  174.              move.l    #$55E,a0         ; Basisadresse nach a0
  175.              move.l    savestat2,8(a0)  ; xcostat (2)
  176.              move.l    savestat5,20(a0) ; xcostat (2)
  177.              move.l    #$57E,a0         ; Basisadresse nach a0
  178.              move.l    saveout2,8(a0)   ; xconout (2)
  179.              move.l    saveout5,20(a0)  ; xconout (2)
  180.  
  181.              move.l    saveUSP,-(sp)    ; alten Stack zurck
  182.              move.w    #$20,-(sp)       ; Super
  183.              trap      #1               ; back to user mode
  184.              addq.l    #6,sp            ; stack korrigieren
  185.              
  186.              rts
  187.  
  188. inst_trap:
  189.              move.l    saveUSP,-(sp)    ; alten Stack zurck
  190.              move.w    #$20,-(sp)       ; Super
  191.              trap      #1               ; back to user mode
  192.              addq.l    #6,sp            ; stack korrigieren
  193.              
  194.              move.l    saveProc,-(sp)   ;alter Vektor
  195.              move.w    #45,-(sp)        ;BIOS Vektor
  196.              move.w    #5,-(sp)         ;Setexc
  197.              trap      #13              ;BIOS
  198.              addq.l    #8,sp
  199.              rts
  200.   END
  201. END RestoreTrap;
  202.  
  203. PROCEDURE TrapProc();
  204. BEGIN
  205.   ASSEMBLER
  206. PROC03:
  207.              btst      #5,(sp)
  208.              beq.s     NoSuper
  209.  
  210.              cmpi.w    #11,6(sp)
  211.              bhi.s     TTStack
  212.              cmpi.w    #3,6(sp)
  213.              bne.s     weiter
  214.              bra.s     ciao
  215. TTStack:     cmpi.w    #3,8(sp)
  216.              bne.s     weiter
  217.              bra.s     ciao
  218. weiter:      move.l    saveProc,-(sp)
  219.              rts
  220.  
  221. ciao:        
  222. (*             break
  223.              move.l    setAdr,a0
  224.              move.b    10(sp),(a0)
  225.              movem.l   d2-d7/a1-a6,-(sp)
  226.              lea       myStack,a3
  227.              move.l    newProc,a0
  228.              jsr       (a0)
  229.              movem.l   (sp)+,d2-d7/a1-a6 *)
  230.              clr.l     d0
  231.              rte
  232.  
  233. NoSuper:     move.l    a0,-(sp)
  234.              move.l    usp,a0
  235.              cmpi.w    #3,(a0)
  236.              bne.s     weiter2
  237.              bra.s     ciao2
  238. weiter2:     movea.l   (sp)+,a0
  239.              move.l    saveProc,-(sp)
  240.              rts
  241. ciao2:       
  242. (*             break
  243.              move.l    setAdr,a0
  244.              move.b    10(sp),(a0)
  245.              movem.l   d2-d7/a1-a6,-(sp)
  246.              lea       myStack,a3
  247.              move.l    newProc,a0
  248.              jsr       (a0)
  249.              movem.l   (sp)+,d2-d7/a1-a6
  250. *)
  251.              clr.l     d0
  252.              movea.l   (sp)+,a0
  253.              rte
  254.  
  255.   END
  256. END TrapProc;
  257.  
  258. PROCEDURE SetCharAddress(adr : ADDRESS);
  259. BEGIN
  260.   ASSEMBLER
  261. ;(* Adresse, an der Speicheradresse fr das auszugebende Zeichen *)
  262. PROC04:      move.l    -(a3),setAdr
  263.              rts
  264.   END
  265. END SetCharAddress;
  266.  
  267. PROCEDURE SetNewProc(adr : ADDRESS);
  268. BEGIN
  269.   ASSEMBLER
  270. ;(* Adresse der auszufhrenden Proc *)
  271. PROC05:      move.l    -(a3),newProc
  272.              rts
  273.   END
  274. END SetNewProc;
  275.  
  276. PROCEDURE SetOutputProc (p: ADDRESS);
  277. (* Setzt die Ausgabeprozedur fr die Ausgabeumlenkung
  278.  *)
  279. BEGIN
  280.   ASSEMBLER
  281.     MOVE.L  -(A3),outProc
  282.   END;
  283. END SetOutputProc;
  284.  
  285. PROCEDURE ClearOutputProc ();
  286. (* L”scht eine ggf. gesetzte Ausgabeprozedur 
  287.  *)
  288. BEGIN
  289.   outProc := outProcType(NIL);
  290. END ClearOutputProc;
  291.  
  292. BEGIN
  293.   outProc := outProcType(NIL);
  294. END ARCAss.
  295.